package br.com.esporte.persistence.DAO.impl;

import java.util.List;

import javax.persistence.Query;

import org.springframework.stereotype.Repository;

import br.com.base.persistencia.DAO.impl.GenericDAOImpl;
import br.com.esporte.model.DiaPraticadoGrupo;
import br.com.esporte.model.Grupo;
import br.com.esporte.model.TipoAdvertenciaEnum;
import br.com.esporte.model.Usuario;
import br.com.esporte.persistence.DAO.DiaPraticadoGrupoDAO;
import br.com.esporte.persistence.filter.FiltroDiaPraticadoGrupo;

/**
 * 
 * @author Milton Domingues
 *
 */
@Repository
public class DiaPraticadoGrupoDAOImpl extends GenericDAOImpl<DiaPraticadoGrupo, Long, FiltroDiaPraticadoGrupo> implements DiaPraticadoGrupoDAO {

	public DiaPraticadoGrupoDAOImpl() {
		super(DiaPraticadoGrupo.class);
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<DiaPraticadoGrupo> consultarDiaPraticadoGrupo(Grupo grupo) {
		StringBuilder hql = new StringBuilder();
		hql.append("FROM DiaPraticadoGrupo dia WHERE dia.grupo = :grupo ORDER BY dia.dataHoraInicio ASC");

		Query query = createQuery(hql.toString());

		query.setParameter("grupo", grupo);

		return  query.getResultList();
	}

	@SuppressWarnings("unchecked")
	@Override
	public Usuario consultarMaiorPontuador(DiaPraticadoGrupo dia) {
		StringBuilder hql = new StringBuilder();
		hql.append("SELECT j.usuario.id, SUM(j.ponto) FROM Jogador j ");
		hql.append("WHERE ");
		hql.append("j.time.partida.diaPraticado = :dia GROUP BY j.usuario.id ");
		hql.append("ORDER BY 2 DESC");

		Query query = createQuery(hql.toString());
		query.setParameter("dia", dia);
		query.setMaxResults(1);
		Long idUsuario = null;
		List<Object[]> usuarios = query.getResultList();
		for (Object object[] : usuarios) {
			idUsuario = (Long) object[0];
		}

		Usuario usuario = null;
		if((idUsuario != null) && (idUsuario > 0)){
			StringBuilder hqlUser = new StringBuilder();
			hqlUser.append("FROM Usuario u WHERE u.id = :id");

			Query query2 = createQuery(hqlUser.toString());
			query2.setParameter("id", idUsuario);
			usuario = (Usuario) query2.getSingleResult();
		}

		return usuario;
	}

	@SuppressWarnings("unchecked")
	@Override
	public DiaPraticadoGrupo consultarProximaDiaPraticadoGrupo(Grupo grupo) {

		StringBuilder hql = new StringBuilder();
		hql.append("FROM DiaPraticadoGrupo dia WHERE dia.grupo = :grupo ORDER BY dia.dataHoraInicio DESC LIMIT 1");

		Query query = createQuery(hql.toString());

		query.setParameter("grupo", grupo);
		List<DiaPraticadoGrupo> list = query.getResultList();
		DiaPraticadoGrupo dia = (list.size() > 0 ? list.get(0) : null);
		return dia;
	}

	@Override
	public Integer consultarQtdAdvertencias(DiaPraticadoGrupo dia, TipoAdvertenciaEnum tipo) {
		StringBuilder hql = new StringBuilder();
		hql.append("SELECT COUNT(*) ");
		hql.append("FROM Advertencia adv ");
		hql.append("WHERE adv.jogador.time.partida.diaPraticado = :dia AND adv.tipoAdvertencia = :tipo");

		Query query = createQuery(hql.toString());
		query.setParameter("dia", dia);
		query.setParameter("tipo", tipo);

		Long qtd = (Long) query.getSingleResult();

		return (qtd != null ? qtd.intValue() : 0);
	}

	@Override
	public Integer consultarQtdPartidas(DiaPraticadoGrupo dia){
		StringBuilder hql = new StringBuilder();
		hql.append("SELECT COUNT(*) ");
		hql.append("FROM Partida partida ");
		hql.append("WHERE partida.diaPraticado = :dia");

		Query query = createQuery(hql.toString());
		query.setParameter("dia", dia);

		Long qtd = (Long) query.getSingleResult();

		return (qtd != null ? qtd.intValue() : 0);
	}

	@Override
	public Integer consultarQtdPontos(DiaPraticadoGrupo dia) {
		StringBuilder hql = new StringBuilder();
		hql.append("SELECT SUM(jogador.ponto) ");
		hql.append("FROM Jogador jogador ");
		hql.append("WHERE jogador.time.partida.diaPraticado = :dia");

		Query query = createQuery(hql.toString());
		query.setParameter("dia", dia);

		Long qtd = (Long) query.getSingleResult();

		return (qtd != null ? qtd.intValue() : 0);
	}

}
